package com.lain.modules.sys.service;

import com.lain.config.CacheConfig;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Title:       CacheService
 * Description: 缓存服务
 *
 * @author : liugaoyang
 * date         : 2019/3/12 11:22
 */
public interface CacheService {

    /**
     * 增加 key - value 形式的键值对至服务器内存中
     * 默认过期时间
     * 默认DB0
     * @param key
     * @param value
     */
    default void set(String key, Object value) {
        set(key, value, CacheConfig.DEFAULT_EXPIRE);
    }

    /**
     * 增加 key - value 形式的键值对至服务器内存中
     * 允许自定义缓存过期时间
     * 默认DB0
     * @param key
     * @param value
     * @param expire
     */
    default void set(String key, Object value, long expire) {
        set(key, value, CacheConfig.DEFAULT_DB, expire);
    }

    /**
     * 根据Key得到缓存对象
     * 默认DB0
     * @param key
     * @return
     */
    default String get(String key) {
        return String.valueOf(get(key, CacheConfig.DEFAULT_DB));
    }

    /**
     * 根据key删除缓存对象
     * 默认DB0
     * @param key
     */
    default void delete(String key) {
        // 如果没有指定数据库序号，默认用DB0
        hdel(key, CacheConfig.DEFAULT_DB);
    }

    /**
     * 普通缓存获取
     * @param key
     * @param indexdb
     * @return
     */
    Object get(String key, int indexdb);

    /**
     * 普通缓存放入
     * @param key
     * @param value
     * @param indexdb
     * @return
     */
    default boolean set(String key, Object value, int indexdb) {
        // 如果没有指定数据库序号，默认用DB0
        set(key, value, indexdb, CacheConfig.NOT_EXPIRE);
        return true;
    }

    /**
     * 缓存放入 （设定超时时长
     * @param key
     * @param value
     * @param indexdb
     * @param expire
     */
    void set(String key, Object value, int indexdb, long expire);


    /**
     * 根据key得到Map结构的value
     * 根据item得到value对应的key的值
     * @param key
     * @param item
     * @param indexdb
     * @return
     */
    Object hget(String key, String item, int indexdb);

    /**
     * 根据key得到Map结构的value
     * 根据item得到value对应的key的值  最后转换为String
     * @param key
     * @param item
     * @param indexdb
     * @return
     */
    default String hgetKeyString(String key, String item, int indexdb) {
        Object hget = hget(key, item, indexdb);
        if(hget != null){
            return String.valueOf(hget);
        }
        return null;
    }

    /**
     * 获取hashkey对应的所有键值
     * @param key
     * @param indexdb
     * @return
     */
    Map<Object, Object> hmget(String key, int indexdb);

    /**
     * 获取hashkey对应的所有键值 返回的Map的Key转为String类型
     * @param key
     * @param indexdb
     * @return
     */
    default Map<String, Object> hmgetForStrKey(String key, int indexdb) {
        Map<Object, Object> hmget = hmget(key, indexdb);
        if(hmget != null && !hmget.isEmpty()){
            Map<String, Object> resMap = new HashMap<>();
            // 映射至新Map
            hmget.forEach((k, v) -> {
                String newKey = String.valueOf(k);
                resMap.put(newKey, v);
            });
            return resMap;
        }
        return null;
    }

    /**
     * 获取hash中某个key的值
     * @param hashName
     * @param key
     * @param indexdb
     * @return
     */
    default String hmgetForsingleKey(String hashName, Object key, int indexdb) {
        return hgetKeyString(hashName, String.valueOf(key), indexdb);
    }

    /**
     * 获取hashkey对应的所有键值
     * @param key
     * @param indexdb
     * @return
     */
    default Map<String, Object> hmgetKeyString(String key, int indexdb) {
        return hmgetForStrKey(key, indexdb);
    }

    /**
     * 向指定DB的一张hash表中放入数据,如果不存在将创建
     * @param key
     * @param item
     * @param value
     * @param indexdb
     * @return
     */
    boolean hset(String key, String item, Object value, int indexdb);

    /**
     * HashSet
     * @param key
     * @param map
     * @param indexdb
     * @return
     */
    boolean hmset(String key, Map<String, Object> map, int indexdb);

    /**
     * 删除hash表
     * @param key
     * @param indexdb
     */
    void hdel(String key, int indexdb);

    /**
     * 判断hash表中是否有该项的值
     * @param key
     * @param item
     * @return
     */
    boolean hHasKey(String key, String item);

    /**
     * 判断是否在缓存中
     * @param key
     * @param index
     * @return
     */
    boolean isContains(String key, int index);

    /**
     * 缓存是否超时失效
     * 默认DB0
     * @param key
     * @return
     */
    boolean isTimeOut(String key, int index);

    /**
     * 清除所有缓存
     * @param index
     */
    void clearAll(int index);

    /**
     * 获取所有key
     * @param index
     * @return
     */
    Set<String> getAllKeys(int index);

}
